package com.woniu.repaircenter.service.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.woniu.exception.XinanException;
import com.woniu.exception.repaircenter.RepairException;
import com.woniu.repaircenter.models.dto.RepairCategoryDTO;
import com.woniu.repaircenter.models.param.SelectRepairCategoryParam;
import com.woniu.repaircenter.models.param.UpdateRepairCategoryParam;
import com.woniu.repaircenter.service.mapper.RepairCategoryMapper;
import com.woniu.repaircenter.service.model.RepairCategory;
import com.woniu.repaircenter.service.service.RepairCategoryService;
import com.github.pagehelper.PageInfo;
import com.woniu.utils.EnumException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;

/**
 * <p>
 * 维修类别表 服务实现类
 * </p>
 *
 * @author 吕雨泽
 * @since 2024年12月06日
 */
@Service
public class RepairCategoryServiceImpl extends ServiceImpl<RepairCategoryMapper, RepairCategory> implements RepairCategoryService {

    @Autowired
    private RepairCategoryMapper repairCategoryMapper;

    /**
     * 添加维修类别
     *
     * @param categoryName 类别名称，需要添加到数据库中的维修类别名称
     * @param adminName    操作用户名，用于记录创建者的用户名
     * @return 返回添加操作影响的行数，表示添加成功与否
     * @throws XinanException 当添加操作失败时抛出的异常
     */
    @Override
    public Integer addRepairCategory(String categoryName, String adminName) throws XinanException {
        // 检查类别名称是否为空或仅包含空格，如果是，则抛出异常
        if (categoryName == null || categoryName.trim().equals("")) {
            throw new RepairException(EnumException.CATEGORY_NAME_NULL);
        }
        // 查询数据库中是否已存在相同名称的维修类别，如果存在，则抛出异常
        RepairCategory category = repairCategoryMapper.selectCategoryName(categoryName);
        if (category != null) {
            throw new RepairException(EnumException.CATEGORY_ALREADY_EXISTS);
        }
        // 创建一个新的维修类别对象
        category = new RepairCategory();
        category.setCategoryName(categoryName);
        category.setCreateUser(adminName);
        // 设置创建日期为当前日期和时间
        category.setCreateDate(LocalDateTime.now().toString());
        // 设置类别状态为1，通常表示可用或激活状态
        category.setCategoryState(1);
        // 调用mapper方法将新的维修类别添加到数据库中
        Integer result = repairCategoryMapper.addRepairCategory(category);
        // 如果添加操作失败（即影响的行数小于或等于0），则抛出异常
        if (result <= 0) {
            throw new RepairException(EnumException.ADD_CATEGORY_FAILED);
        }
        // 返回添加操作影响的行数
        return result;
    }

    /**
     * 分页查询维修类别列表
     *
     * @param srcp 查询参数，包括页码和每页大小
     * @return 包含维修类别信息的分页对象
     * @throws XinanException 如果查询过程中发生错误，抛出自定义异常
     */
    @Override
    @Transactional
    public PageInfo<RepairCategoryDTO> listRepairCategory(SelectRepairCategoryParam srcp) throws XinanException {
        // 设置默认值
        int pageNum = srcp.getPageNum() == null ? 1 : srcp.getPageNum();
        int pageSize = srcp.getPageSize() == null ? 10 : srcp.getPageSize();
        // 创建分页对象
        PageHelper.startPage(pageNum, pageSize);
        //将 SelectRepairCategoryParam 转换为 RepairCategory
        RepairCategory category = BeanUtil.toBean(srcp, RepairCategory.class);
        // 执行查询
        List<RepairCategoryDTO> repairCategoryDTOPage = repairCategoryMapper.selectCategoryList(category);
        // 构建 PageInfo 对象
        PageInfo<RepairCategoryDTO> pageInfo = new PageInfo<>(repairCategoryDTOPage);
        // 处理 DTO 的状态描述
        for (RepairCategoryDTO repairCategoryDTO : pageInfo.getList()) {
            repairCategoryDTO.setCategoryDesc(repairCategoryDTO.getCategoryState() == 1 ? "启用" : "禁用");
        }
        return pageInfo;
    }

    /**
     * 更新维修类别信息
     *
     * @param srcp      更新参数，包含类别信息
     * @param adminName 更新操作的用户名
     * @return 更新结果，影响的记录数
     * @throws XinanException 如果更新过程中发生错误，抛出自定义异常
     */
    @Override
    public Integer updateCategory(UpdateRepairCategoryParam srcp, String adminName) throws XinanException {
        // 检查更新参数是否有效，如果无效则抛出异常
        if (srcp == null || srcp.getRepairCategoryId() == null || srcp.getCategoryName() == null || srcp.getCategoryName().equals("")) {
            throw new RepairException(EnumException.INVALID_PARAMETER);
        }
        // 将更新参数转换为维修类别对象，并设置更新人和更新时间
        RepairCategory category = BeanUtil.toBean(srcp, RepairCategory.class);
        category.setUpdateUser(adminName);
        category.setUpdateTime(LocalDateTime.now().toString());
        // 调用Mapper方法更新维修类别信息，并获取更新结果
        Integer result = repairCategoryMapper.updateCategory(category);
        // 如果更新失败，抛出异常
        if (result <= 0) {
            throw new RepairException(EnumException.UPDATE_CATEGORY_FAILED);
        }
        return result;
    }

    /**
     * 获取所有维修类别列表
     *
     * @return 维修类别列表
     * @throws Exception 异常
     */
    @Override
    public List<RepairCategoryDTO> listAllRepairCategory() throws Exception {
        // 创建一个维修类别对象并设置其状态为有效
        QueryWrapper<RepairCategory> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("category_state", 1);
        // 调用Mapper方法获取维修类别列表
        List<RepairCategory> repairCategoryDTOS = repairCategoryMapper.selectList(queryWrapper);
        // 将维修类别列表转换为 DTO 列表
        List<RepairCategoryDTO> repairCategoryDTOList = BeanUtil.copyToList(repairCategoryDTOS, RepairCategoryDTO.class);
        // 处理 DTO 的状态描述
        for (RepairCategoryDTO repairCategoryDTO : repairCategoryDTOList) {
            repairCategoryDTO.setCategoryDesc(repairCategoryDTO.getCategoryState() == 1 ? "启用" : "禁用");
        }
        // 返回维修类别列表
        return repairCategoryDTOList;
    }

    /**
     * 更新维修类别的状态
     *
     * @param repairCategoryId 维修类别的ID，用于定位要更新的状态
     * @param adminName 管理员名称，用于记录更新操作的执行者
     * @return 返回更新操作影响的行数
     * @throws Exception 如果发生错误，抛出异常
     */
    @Override
    public Integer updateStatus(Integer repairCategoryId, String adminName) throws Exception {
        // 检查维修类别ID是否为空，如果为空则抛出参数无效异常
        if (repairCategoryId == null) {
            throw new RepairException(EnumException.INVALID_PARAMETER);
        }
        // 通过ID获取维修类别对象
        RepairCategory repairCategory = repairCategoryMapper.selectById(repairCategoryId);
        // 检查获取的维修类别对象是否为空，如果为空则抛出数据库错误异常
        if (repairCategory == null) {
            throw new RepairException(EnumException.DATABASE_ERROR);
        }
        // 更新维修类别的状态，如果当前状态为1，则改为0；如果为0，则改为1
        repairCategory.setCategoryState(repairCategory.getCategoryState() == 1 ? 0 : 1);
        // 设置更新操作的执行者
        repairCategory.setUpdateUser(adminName);
        // 设置更新操作的时间
        repairCategory.setUpdateTime(LocalDateTime.now().toString());
        // 执行更新操作，并获取影响的行数
        Integer integer = repairCategoryMapper.updateCategory(repairCategory);
        // 返回影响的行数
        return integer;
    }

    @Override
    public String selectById(Long repairCategoryId) throws Exception {
        RepairCategory repairCategory = repairCategoryMapper.selectById(repairCategoryId);
        if (repairCategory != null) {
            return repairCategory.getCategoryName();
        }
        return null;
    }


}
